home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / snmp / mib2c-data / mfd-access-container-cached-defines.m2i < prev    next >
Text File  |  2008-09-22  |  18KB  |  577 lines

  1. #######################################################################
  2. ###generic include for XXX. Do not use directly.
  3. ###
  4. ### $Id: mfd-access-container-cached-defines.m2i 14170 2006-01-26 17:02:48Z dts12 $
  5. ########################################################################
  6. @if $m2c_mark_boundary == 1@
  7. /** START code generated by $RCSfile$ $Revision: 14170 $ */
  8. @end@
  9. ##//####################################################################
  10. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  11. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  12. @if $m2c_processing_type eq 'h'@
  13.  
  14. @   if $m2c_data_cache != 1@
  15. void ${context}_container_init(netsnmp_container **container_ptr_ptr);
  16. @   else@
  17.     /*
  18.      * TODO:180:o: Review ${context} cache timeout.
  19.      * The number of seconds before the cache times out
  20.      */
  21. #define $context.uc_CACHE_TIMEOUT   60
  22.  
  23. void ${context}_container_init(netsnmp_container **container_ptr_ptr,
  24.                              netsnmp_cache *cache);
  25. @   end@ # data cache
  26. void ${context}_container_shutdown(netsnmp_container *container_ptr);
  27.  
  28. int ${context}_container_load(netsnmp_container *container);
  29. void ${context}_container_free(netsnmp_container *container);
  30.  
  31. @   if $m2c_data_cache == 1@
  32. int ${context}_cache_load(netsnmp_container *container);
  33. void ${context}_cache_free(netsnmp_container *container);
  34.  
  35. @   end@
  36. @   if $m2c_include_examples == 1@
  37. $example_start
  38. /* *********************************************************************
  39.  * Since we have no idea how you really access your data, we'll go with
  40.  * a worst case example: a flat text file.
  41.  */
  42. #define MAX_LINE_SIZE 256
  43. $example_end
  44. @   end@ // example
  45. @end@ // m2c_processing_type eq 'h'
  46. ##//####################################################################
  47. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  48. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  49. @if $m2c_processing_type eq 'c'@
  50. /**
  51.  * container overview
  52.  *
  53.  */
  54.  
  55. /**
  56.  * container initialization
  57.  *
  58.  * @param container_ptr_ptr A pointer to a container pointer. If you
  59.  *        create a custom container, use this parameter to return it
  60.  *        to the MFD helper. If set to NULL, the MFD helper will
  61.  *        allocate a container for you.
  62. @   if $m2c_data_cache == 1@
  63.  * @param  cache A pointer to a cache structure. You can set the timeout
  64.  *         and other cache flags using this pointer.
  65. @   end@
  66.  *
  67.  *  This function is called at startup to allow you to customize certain
  68.  *  aspects of the access method. For the most part, it is for advanced
  69.  *  users. The default code should suffice for most cases. If no custom
  70.  *  container is allocated, the MFD code will create one for your.
  71.  *
  72. @   if $m2c_data_cache == 1@
  73.  *  This is also the place to set up cache behavior. The default, to
  74.  *  simply set the cache timeout, will work well with the default
  75.  *  container. If you are using a custom container, you may want to
  76.  *  look at the cache helper documentation to see if there are any
  77.  *  flags you want to set.
  78.  *
  79. @   end@
  80.  * @remark
  81.  *  This would also be a good place to do any initialization needed
  82.  *  for you data source. For example, opening a connection to another
  83.  *  process that will supply the data, opening a database, etc.
  84.  */
  85. void
  86. @   if $m2c_data_cache != 1@
  87. ${context}_container_init(netsnmp_container **container_ptr_ptr)
  88. @   else@
  89. ${context}_container_init(netsnmp_container **container_ptr_ptr,
  90.                              netsnmp_cache *cache)
  91. @   end@
  92. {
  93.     DEBUGMSGTL(("verbose:${context}:${context}_container_init","called\n"));
  94.     
  95.     if (NULL == container_ptr_ptr) {
  96.         snmp_log(LOG_ERR,"bad container param to ${context}_container_init\n");
  97.         return;
  98.     }
  99.  
  100.     /*
  101.      * For advanced users, you can use a custom container. If you
  102.      * do not create one, one will be created for you.
  103.      */
  104.     *container_ptr_ptr = NULL;
  105.  
  106. @if $m2c_data_cache == 1@
  107.     if (NULL == cache) {
  108.         snmp_log(LOG_ERR,"bad cache param to ${context}_container_init\n");
  109.         return;
  110.     }
  111.  
  112.     /*
  113.      * TODO:345:A: Set up $context cache properties.
  114.      *
  115.      * Also for advanced users, you can set parameters for the
  116.      * cache. Do not change the magic pointer, as it is used
  117.      * by the MFD helper. To completely disable caching, set
  118.      * cache->enabled to 0.
  119.      */
  120.     cache->timeout = $context.uc_CACHE_TIMEOUT; /* seconds */
  121. @end@
  122. } /* ${context}_container_init */
  123.  
  124. /**
  125.  * container shutdown
  126.  *
  127.  * @param container_ptr A pointer to the container.
  128.  *
  129.  *  This function is called at shutdown to allow you to customize certain
  130.  *  aspects of the access method. For the most part, it is for advanced
  131.  *  users. The default code should suffice for most cases.
  132.  *
  133.  *  This function is called before ${context}_container_free().
  134.  *
  135.  * @remark
  136.  *  This would also be a good place to do any cleanup needed
  137.  *  for you data source. For example, closing a connection to another
  138.  *  process that supplied the data, closing a database, etc.
  139.  */
  140. void
  141. ${context}_container_shutdown(netsnmp_container *container_ptr)
  142. {
  143.     DEBUGMSGTL(("verbose:${context}:${context}_container_shutdown","called\n"));
  144.     
  145.     if (NULL == container_ptr) {
  146.         snmp_log(LOG_ERR,"bad params to ${context}_container_shutdown\n");
  147.         return;
  148.     }
  149.  
  150. } /* ${context}_container_shutdown */
  151.  
  152. /**
  153.  * load initial data
  154.  *
  155.  * TODO:350:M: Implement $context data load
  156. @   if $m2c_data_cache == 1@
  157.  * This function will also be called by the cache helper to load
  158.  * the container again (after the container free function has been
  159.  * called to free the previous contents).
  160. @   end@
  161.  *
  162.  * @param container container to which items should be inserted
  163.  *
  164.  * @retval MFD_SUCCESS              : success.
  165.  * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
  166.  * @retval MFD_ERROR                : other error.
  167.  *
  168.  *  This function is called to load the index(es) (and data, optionally)
  169.  *  for the every row in the data set.
  170.  *
  171.  * @remark
  172.  *  While loading the data, the only important thing is the indexes.
  173.  *  If access to your data is cheap/fast (e.g. you have a pointer to a
  174.  *  structure in memory), it would make sense to update the data here.
  175.  *  If, however, the accessing the data invovles more work (e.g. parsing
  176.  *  some other existing data, or peforming calculations to derive the data),
  177.  *  then you can limit yourself to setting the indexes and saving any
  178.  *  information you will need later. Then use the saved information in
  179.  *  ${context}_row_prep() for populating data.
  180.  *
  181.  * @note
  182.  *  If you need consistency between rows (like you want statistics
  183.  *  for each row to be from the same time frame), you should set all
  184.  *  data here.
  185.  *
  186.  */
  187. int
  188. ${context}_container_load(netsnmp_container *container)
  189. {
  190.     ${context}_rowreq_ctx *rowreq_ctx;
  191.     size_t                 count = 0;
  192.  
  193.     /*
  194.      * temporary storage for index values
  195.      */
  196. @  foreach $node index@
  197. @    include m2c_setup_node.m2i@
  198.         /*
  199.          * $m2c_node_summary
  200.          */
  201. @    if $m2c_node_needlength == 1@
  202. @        eval $m2c_gi_maxlen = (126 - $node.oidlength - $m2c_gi_others)@
  203. @        if $m2c_node_maxlen > $m2c_gi_maxlen@
  204. @            eval $m2c_node_maxlen = $m2c_gi_maxlen@
  205.         /** 128 - 1(entry) - 1(col) - $m2c_gi_others(other indexes) = $m2c_node_maxlen */
  206. @        end@
  207. @    end@ # needlength
  208. @    include node-storage.m2i@
  209. @  end@ // foreach
  210.  
  211. @if $m2c_include_examples == 1@
  212.     
  213.     /*
  214.      * this example code is based on a data source that is a
  215.      * text file to be read and parsed.
  216.      */
  217.     FILE *filep;
  218.     char line[MAX_LINE_SIZE];
  219. @end@ // examples
  220.  
  221.     DEBUGMSGTL(("verbose:${context}:${context}_container_load","called\n"));
  222.  
  223. @if $m2c_include_examples == 1@
  224. $example_start
  225.     /*
  226.      * open our data file.
  227.      */
  228.     filep = fopen("/etc/dummy.conf", "r");
  229.     if(NULL ==  filep) {
  230.         return MFD_RESOURCE_UNAVAILABLE;
  231.     }
  232.  
  233. $example_end
  234. @end@ // example
  235.     /*
  236.      * TODO:351:M: |-> Load/update data in the $context container.
  237.      * loop over your $context data, allocate a rowreq context,
  238.      * set the index(es) [and data, optionally] and insert into
  239.      * the container.
  240.      */
  241.     while( 1 ) {
  242. @   if $m2c_include_examples == 0@
  243.         /*
  244.          * check for end of data; bail out if there is no more data
  245.          */
  246.         if( 1 )
  247.             break;
  248. @   else@
  249. $example_start
  250.     /*
  251.      * get a line (skip blank lines)
  252.      */
  253.     do {
  254.         if (!fgets(line, sizeof(line), filep)) {
  255.             /* we're done */
  256.             fclose(filep);
  257.             filep = NULL;
  258.         }
  259.     } while (filep && (line[0] == '\n'));
  260.  
  261.     /*
  262.      * check for end of data
  263.      */
  264.     if(NULL == filep)
  265.         break;
  266.  
  267.     /*
  268.      * parse line into variables
  269.      */
  270. $example_end
  271. @    end@ # example
  272.  
  273.         /*
  274.          * TODO:352:M: |   |-> set indexes in new $context rowreq context.
  275. @   eval $m2c_tmp = ""@
  276. @   if ($m2c_data_allocate == 1) || ($m2c_data_init == 1)@
  277. @      eval $m2c_tmp = "NULL"@
  278. @      if ($m2c_data_allocate == 1) && ($m2c_data_init == 1)@
  279. @         eval $m2c_tmp = "$m2c_tmp, NULL"@
  280.          * data context will be set from the first param (unless NULL,
  281.          *      in which case a new data context will be allocated)
  282.          * the second param will be passed, with the row context, to
  283.          *      ${context}rowreq_ctx_init.
  284. @      else@
  285.          * data context will be set from the param (unless NULL,
  286.          *      in which case a new data context will be allocated)
  287. @      @end@
  288. @   end@
  289.          */
  290.         rowreq_ctx = ${context}_allocate_rowreq_ctx($m2c_tmp);
  291.         if (NULL == rowreq_ctx) {
  292.             snmp_log(LOG_ERR, "memory allocation failed\n");
  293.             return MFD_RESOURCE_UNAVAILABLE;
  294.         }
  295.         if(MFD_SUCCESS != ${context}_indexes_set(rowreq_ctx
  296. @   foreach $node index@
  297. @      include m2c_setup_node.m2i@
  298. @        if $m2c_node_needlength == 1@
  299.                                , $node, ${node}_len
  300. @        else@
  301.                                , $node
  302. @        end@
  303. @   end@ # foreach index
  304.                )) {
  305.             snmp_log(LOG_ERR,"error setting index while loading "
  306.                      "${context} data.\n");
  307.             ${context}_release_rowreq_ctx(rowreq_ctx);
  308.             continue;
  309.         }
  310.  
  311.         /*
  312.          * TODO:352:r: |   |-> populate $context data context.
  313.          * Populate data context here. (optionally, delay until row prep)
  314.          */
  315. @if $m2c_data_transient == 0@ # persistent
  316.     /* non-TRANSIENT data: no need to copy. set pointer to data */
  317. @else@
  318.     /*
  319.      * TRANSIENT or semi-TRANSIENT data:
  320.      * copy data or save any info needed to do it in row_prep.
  321.      */
  322. @   foreach $node nonindex@
  323. @      include m2c_setup_node.m2i@
  324.     /*
  325.      * setup/save data for $node
  326.      * $m2c_node_summary
  327.      */
  328. @      if "$m2c_data_context" eq "generated"@
  329. @         eval $m2c_ctx_lh = "$m2c_ctx_rh"@
  330. @         eval $m2c_ctx_lhs = "$m2c_ctx_rhs"@
  331. @         eval $m2c_ctx_rh = "$node"@
  332. @         eval $m2c_ctx_rhs = "${node}_len"@
  333. @         include generic-value-map.m2i@
  334.     
  335. @      end@ # data_context ! generated
  336. @   end@ // for each
  337. @end@ # transient
  338.         
  339.         /*
  340.          * insert into table container
  341.          */
  342.         CONTAINER_INSERT(container, rowreq_ctx);
  343.         ++count;
  344.     }
  345. @if $m2c_include_examples == 1@
  346.  
  347. $example_start
  348.     if(NULL != filep)
  349.         fclose(filep);
  350. $example_end
  351. @end@ # example
  352.  
  353.     DEBUGMSGT(("verbose:${context}:${context}_container_load",
  354.                "inserted %d records\n", count));
  355.  
  356.     return MFD_SUCCESS;
  357. } /* ${context}_container_load */
  358.  
  359. /**
  360.  * container clean up
  361.  *
  362.  * @param container container with all current items
  363.  *
  364.  *  This optional callback is called prior to all
  365.  *  item's being removed from the container. If you
  366.  *  need to do any processing before that, do it here.
  367.  *
  368.  * @note
  369.  *  The MFD helper will take care of releasing all the row contexts.
  370. @   if ($m2c_data_allocate == 1) && ($m2c_data_transient == 0)@
  371.  *  If you did not pass a data context pointer when allocating
  372.  *  the rowreq context, the one that was allocated will be deleted.
  373.  *  If you did pass one in, it will not be deleted and that memory
  374.  *  is your responsibility.
  375. @   end@
  376.  *
  377.  */
  378. void
  379. ${context}_container_free(netsnmp_container *container)
  380. {
  381.     DEBUGMSGTL(("verbose:${context}:${context}_container_free","called\n"));
  382.  
  383.     /*
  384.      * TODO:380:M: Free $context container data.
  385.      */
  386. } /* ${context}_container_free */
  387.  
  388. @end@ // m2c_processing_type eq 'c'
  389. ########################################################################
  390. ##//####################################################################
  391. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  392. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  393. @if $m2c_processing_type eq 'i'@
  394. @   if $m2c_data_cache == 1@
  395. static void _container_free(netsnmp_container *container);
  396.  
  397. /**
  398.  * @internal
  399.  */
  400. static int
  401. _cache_load(netsnmp_cache *cache, void *vmagic)
  402. {
  403.     DEBUGMSGTL(("internal:${context}:_cache_load","called\n"));
  404.  
  405.     if((NULL == cache) || (NULL == cache->magic)) {
  406.         snmp_log(LOG_ERR, "invalid cache for ${context}_cache_load\n");
  407.         return -1;
  408.     }
  409.  
  410.     /** should only be called for an invalid or expired cache */
  411.     netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
  412.     
  413.     /*
  414.      * call user code
  415.      */
  416.     return ${context}_container_load((netsnmp_container*)cache->magic);
  417. } /* _cache_load */
  418.  
  419. /**
  420.  * @internal
  421.  */
  422. static void
  423. _cache_free(netsnmp_cache *cache, void *magic)
  424. {
  425.     netsnmp_container *container;
  426.  
  427.     DEBUGMSGTL(("internal:${context}:_cache_free","called\n"));
  428.  
  429.     if((NULL == cache) || (NULL == cache->magic)) {
  430.         snmp_log(LOG_ERR, "invalid cache in ${context}_cache_free\n");
  431.         return;
  432.     }
  433.  
  434.     container = (netsnmp_container*)cache->magic;
  435.  
  436.     _container_free(container);
  437. } /* _cache_free */
  438.  
  439. @   end@ # cache
  440. /**
  441.  * @internal
  442.  */
  443. static void
  444. _container_item_free(${context}_rowreq_ctx *rowreq_ctx, void *context)
  445. {
  446.     DEBUGMSGTL(("internal:${context}:_container_item_free","called\n"));
  447.  
  448.     if(NULL == rowreq_ctx)
  449.         return;
  450.  
  451.     ${context}_release_rowreq_ctx(rowreq_ctx);
  452. } /* _container_item_free */
  453.  
  454. /**
  455.  * @internal
  456.  */
  457. static void
  458. _container_free(netsnmp_container *container)
  459. {
  460.     DEBUGMSGTL(("internal:${context}:_container_free","called\n"));
  461.  
  462.     if (NULL == container) {
  463.         snmp_log(LOG_ERR, "invalid container in ${context}_container_free\n");
  464.         return;
  465.     }
  466.  
  467.     /*
  468.      * call user code
  469.      */
  470.     ${context}_container_free(container);
  471.     
  472.     /*
  473.      * free all items. inefficient, but easy.
  474.      */
  475.     CONTAINER_CLEAR(container,
  476.                     (netsnmp_container_obj_func *)_container_item_free,
  477.                     NULL);
  478. } /* _container_free */
  479.  
  480. /**
  481.  * @internal
  482.  * initialize the container with functions or wrappers
  483.  */
  484. void
  485. _${context}_container_init(${context}_interface_ctx *if_ctx)
  486. {
  487.     DEBUGMSGTL(("internal:${context}:_${context}_container_init","called\n"));
  488.  
  489. @   if $m2c_data_cache == 1@
  490.     /*
  491.      * cache init
  492.      */
  493. @    if 0@
  494.     if_ctx->cache =
  495.         netsnmp_cache_find_by_oid(PARTNER_oid, OID_LENGTH(PARTNER_oid));
  496. @    else@
  497.     if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
  498.                                          _cache_load, _cache_free,
  499.                                          ${context}_oid,
  500.                                          ${context}_oid_size);
  501. @    end@ // shared cache
  502.  
  503.     if(NULL == if_ctx->cache) {
  504.         snmp_log(LOG_ERR, "error creating cache for ${context}\n");
  505.         return;
  506.     }
  507.  
  508.     if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
  509.  
  510.     ${context}_container_init(&if_ctx->container, if_ctx->cache);
  511. @   else@
  512.     /*
  513.      * container init
  514.      */    
  515.     ${context}_container_init(&if_ctx->container);
  516. @   end@ data cache
  517.     if(NULL == if_ctx->container)
  518.         if_ctx->container = netsnmp_container_find("${context}:table_container");
  519.     if(NULL == if_ctx->container) {
  520.         snmp_log(LOG_ERR,"error creating container in "
  521.                  "${context}_container_init\n");
  522.         return;
  523.     }
  524.  
  525. @   if $m2c_data_cache == 1@
  526.     if (NULL != if_ctx->cache)
  527.         if_ctx->cache->magic = (void*)if_ctx->container;
  528. @   end@
  529. } /* _${context}_container_init */
  530.  
  531. /**
  532.  * @internal
  533.  * shutdown the container with functions or wrappers
  534.  */
  535. void
  536. _${context}_container_shutdown(${context}_interface_ctx *if_ctx)
  537. {
  538.     DEBUGMSGTL(("internal:${context}:_${context}_container_shutdown","called\n"));
  539.  
  540.     ${context}_container_shutdown(if_ctx->container);
  541.  
  542.     _container_free(if_ctx->container);
  543.  
  544. } /* _${context}_container_shutdown */
  545.  
  546. @end@ // m2c_processing_type eq 'i'
  547. ########################################################################
  548. ##//####################################################################
  549. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  550. ##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  551. @if $m2c_processing_type eq 'r'@
  552. ##
  553.   container summary
  554.   ------------------------
  555.     The container data access code is for cases when you want to
  556.     store your data in the agent/sub-agent.
  557.  
  558.     ... to be continued...
  559.  
  560.  
  561. @   if $m2c_data_cache == 1@
  562.   cache summary
  563.   ------------------------
  564.     The container-cached data access code is for cases when you want to
  565.     cache your data in the agent/sub-agent.
  566.  
  567.     ... to be continued...
  568.  
  569.  
  570. @   end@
  571. @end@ // m2c_processing_type eq 'r'
  572. ########################################################################
  573. ##//####################################################################
  574. @if $m2c_mark_boundary == 1@
  575. /** END code generated by $RCSfile$ $Revision: 14170 $ */
  576. @end@
  577.